<?php

/**
 * @author macaron
 * @copyright 2011
 * @version v0.9.5 RC1
 * 
 * Skrypt wysyłający newsletter z wybranymi wcześniej parametrami
 * i ich minimalnymi wartościami dla określonych lokalizacji
 * jedynie dla użytkowników, którzy mają zdefiniowaną minimalnie
 * jedną lokację wraz z jednym parametrem i odpowiadającą mu
 * minimalną wartością (jeśli brak jakiejkolwiek wartości, mail
 * nie zostanie wysłany)
 */

$emails=getEmails();
for ($i=0; $i<sizeof($emails); $i++) {
	$tmp=splitParametersFromValues($emails[$i]['id']);
	$parameters=$tmp[0];
	$allParameters=$tmp[1];
	$allValues=$tmp[2];
	$splittedParams=splitString($allParameters);
	$splittedValues=splitString($allValues);
	$locationString=getLocations($emails[$i]['id']); //$locationString[0]['news_locations'];
	if (($locationString[0]['news_locations']!=null) && (!empty($parameters))) {
		$messageText='<h2>Twoje alerty pogodowe</h2>';
		$locations=splitString($locationString[0]['news_locations']);
		for ($j=0; $j<sizeof($locations); $j++){
			$messageText.='Miejscowość: <b>'.getLocationName($locations[$j]).'</b><br /><table cellpadding="16" cellspacing="0" style="border: 1px solid #c0c0c0; text-align: center;">';
			$messageText.='<tr style="border: 1px solid #c0c0c0; text-align: center;">';
			for ($k=0; $k<sizeof($splittedParams); $k++) {
				if (($splittedParams[$k]=='u_wind_10m')||($splittedParams[$k]=='v_wind_10m')) {
					$messageText.='<td style="border: 1px solid #c0c0c0; text-align: center;">'.replaceName($splittedParams[$k]).'<br />(min: '.changeUnits($splittedParams[$k], $parameters[$splittedParams[$k]], $parameters[$splittedParams[$k+1]]).'):</td>';
					$k++;
				}
				else
					$messageText.='<td style="border: 1px solid #c0c0c0; text-align: center;">'.replaceName($splittedParams[$k]).'<br />(min: '.changeUnits($splittedParams[$k], $parameters[$splittedParams[$k]]).'):</td>';
			}
			$messageText.='<td style="border: 1px solid #c0c0c0; text-align: center;">Data/godzina:</td>';
			$messageText.='</tr>';
			$data=splitAndFind($allParameters, $allValues, $locations[$j]);
			for ($k=0; $k<sizeof($data); $k++) {
				$messageText.='<tr style="border: 1px solid #c0c0c0; text-align: center;">';
				for ($l=0; $l<sizeof($splittedParams); $l++) {
					if (($splittedParams[$l]=='u_wind_10m')||($splittedParams[$l]=='v_wind_10m')) {
						$messageText.='<td style="border: 1px solid #c0c0c0; text-align: center;">'.changeUnits($splittedParams[$l], $data[$k][$splittedParams[$l]], $data[$k][$splittedParams[$l+1]]).'</td>';
						$l++;
					}
					else
					$messageText.='<td style="border: 1px solid #c0c0c0; text-align: center;">'.changeUnits($splittedParams[$l], $data[$k][$splittedParams[$l]]).'</td>';
				}
				$messageText.='<td style="border: 1px solid #c0c0c0; text-align: center;">'.$data[$k]['datetime_stamp'].'</td>';
				$messageText.='</tr>';
			}
			$messageText.='</table><br/><br/>';
		}
		$message = new YiiMailMessage;
		$message->setBody($messageText, 'text/html');
		$message->subject = 'Twoje alerty pogodowe';
		$message->addTo($emails[$i]['email']);
		$message->from = Yii::app()->params['adminEmail'];
		if (Yii::app()->mail->send($message))
			echo 'mail sent: '.$emails[$i]['email'].'<br />';
		else
			echo 'mail error: '.$emails[$i]['email'].'<br />';
	}
}

/* *
 * pobieranie listy ID userów i ich maili
 */
function getEmails(){
	$sql='SELECT id,email FROM tbl_users';
	$connection=Yii::app()->db;
	$command=$connection->createCommand($sql);
	$rows=$command->queryAll();
	
	return $rows;
}

/* *
 * pobieranie parametrów zdefiniowanych przez usera
 */
function getParameters($id){
	$sql='SELECT parameters FROM tbl_profiles WHERE user_id=:id';
	$connection=Yii::app()->db;
	$command=$connection->createCommand($sql);
	$command->bindParam(":id",$id,PDO::PARAM_INT);
	$rows=$command->queryAll();
	
	return $rows;
}

/* *
 * funkcja, która rozdziela parametry
 */
/*function splitParameters($data){
	return explode(',', substr($data[0]['parameters'], 0, -1));
}*/

/* *
 * funkcja, która zwraca pary parametrów i ich wartości
 * oprócz tego zwraca ciąg parametrów i ciąg wartości
 */
function splitParametersFromValues($id){
	$temp=getParameters($id);
	$parameters=splitString($temp[0]['parameters']);
	$allParameters='';
	$allValues='';
	$data = array();
	foreach($parameters as $parameter){
		$tmp=explode('=', $parameter);
		$allParameters.=$tmp[0].',';
		if (isset($tmp[1])) {
			$data[$tmp[0]] = $tmp[1];
			$allValues.=$tmp[1].',';
		}
	}
	return array($data,$allParameters,$allValues);
}

/* *
 * pobieranie lokacji zdefiniowanych prez usera
 */
function getLocations($id){
	$sql='SELECT news_locations FROM tbl_profiles WHERE user_id=:id';
	$connection=Yii::app()->db;
	$command=$connection->createCommand($sql);
	$command->bindParam(":id",$id,PDO::PARAM_INT);
	$rows=$command->queryAll();
	
	return $rows;
}

/* *
 * pobranie nazwy lokacji do wyświetlenia w mailu
 */
function getLocationName($id){
	$sql='SELECT title FROM location WHERE id=:id';
	$connection=Yii::app()->db;
	$command=$connection->createCommand($sql);
	$command->bindParam(":id",$id,PDO::PARAM_INT);
	$rows=$command->queryAll();
	
	return $rows[0]['title'];
}

/* *
 * rozdzielenie stringa do osobnych komórek tablicy
 */
function splitString($string){
	return explode(',', substr($string, 0, -1));
}

/* *
 * rozdzielanie parametrów i ich wartości do osobnych
 * komórek tablicy, tworzenie zapytania SQL z minimalnymi
 * wartościami (...WHERE param >= value AND...) zdefiniowanymi
 * wcześniej przez usera i wykonanie zapytania na bazie
 * wynikiem jest macierz wartości dla wybranych parametrów
 * dla jednej lokacji
 */
function splitAndFind($parameters,$values,$locationId){
	//$splittedParams=explode(',', substr($parameters, 0, -1));
	//$splittedValues=explode(',', substr($values, 0, -1));
	$splittedParams=splitString($parameters);
	$splittedValues=splitString($values);
	
	if ($splittedParams[0]!='') {
		$sql='SELECT '.$parameters.'datetime_stamp FROM weather WHERE ';
		for ($i=0; $i<sizeof($splittedParams); $i++){
			$sql.=$splittedParams[$i].'>='.$splittedValues[$i];
			if ($i!=(sizeof($splittedParams)-1))
				$sql.=' AND ';
		}
		$sql.=' AND id_loc=:id ORDER BY datetime_stamp';
	}
	$connection=Yii::app()->db;
	$command=$connection->createCommand($sql);
	$command->bindParam(":id",$locationId,PDO::PARAM_INT);
	$rows=$command->queryAll();
	
	return $rows;
}

/* *
 * zamiana nazw kolumn z bazy danych na rzeczywiste nazwy
 */
function replaceName($name) {
	if ($name=='skin_temp')
		return 'Temp. odczuwalna';
	else if ($name=='soil_temp')
		return 'Temp. gleby';
	else if ($name=='visibility')
		return 'Widzialność';
	else if ($name=='u_wind_10m')
		return 'Prędkość i kierunek wiatru';
	else if ($name=='v_wind_10m')
		return 'Wiatr pionowo';
	else if ($name=='total_col_rain')
		return 'Deszcz';
	else if ($name=='total_col_snow')
		return 'Śnieg';
	else if ($name=='surf_rel_hum')
		return 'Wilgotność';
	else if ($name=='low_cloud_fra')
		return 'Niski pułap chmur';
	else if ($name=='mid_cloud_fra')
		return 'Średni pułap chmur';
	else if ($name=='high_cloud_fra')
		return 'Wysoki pułap chmur';
	else return 'error';
}

/* *
 * zamiana jednostek ze względu na kolumnę w bazie danych
 * a także określenie prędkości i kierunku wiatru
 */
function changeUnits ($param, $value, $value2=0) {
	if ($param=='skin_temp')
		return round($value-273.15, 2).' &deg;C';
	else if ($param=='soil_temp')
		return round($value-273.15, 2).' &deg;C';
	else if ($param=='visibility') {
		$tmp=0.00;
		$tmp=$value/1000;
		return $tmp.' km';
	}
	else if ($value2==0 && (($param=='u_wind_10m') || ($param=='v_wind_10m')))
		return $value.' m/s';
	else if (($param=='u_wind_10m') || ($param=='v_wind_10m')) {
		$wind_speed=sqrt($value*$value + $value2*$value2);
		$wind_direction=abs(atan($value2/$value)*57.2957795);
		$wind_direction=round($wind_direction, 2);
		if ($wind_direction>=0 && $wind_direction<22.5)
			$tmp='N';
		else if ($wind_direction>=22.5 && $wind_direction<67.5)
			$tmp='NE';
		else if ($wind_direction>=67.5 && $wind_direction<112.5)
			$tmp='E';
		else if ($wind_direction>=112.5 && $wind_direction<157.5)
			$tmp='ES';
		else if ($wind_direction>=157.5 && $wind_direction<202.5)
			$tmp='S';
		else if ($wind_direction>=202.5 && $wind_direction<247.5)
			$tmp='SW';
		else if ($wind_direction>=247.5 && $wind_direction<292.5)
			$tmp='W';
		else if ($wind_direction>=292.5 && $wind_direction<337.5)
			$tmp='NW';
		else if ($wind_direction>=337.5 && $wind_direction<=360)
			$tmp='N';
		return round($wind_speed, 2).' m/s<br />kierunek: '.$tmp;
	}
	else if ($param=='total_col_rain')
		return round($value, 2).' mm';
	else if ($param=='total_col_snow')
		return round($value, 2).' mm';
	else if ($param=='surf_rel_hum')
		return round($value, 2).' %';
	else if ($param=='low_cloud_fra')
		return round($value, 2).' %';
	else if ($param=='mid_cloud_fra')
		return round($value, 2).' %';
	else if ($param=='high_cloud_fra')
		return round($value, 2).' %';
	else return 'error';
}

?>